# Python 字符串类型

# 字符串类型是 Python 中最常用的类型，它可以存储和处理文本信息。
# 字符串类型是以单引号或双引号括起来的任意文本序列，可以包含任意的 ASCII 字符。
# 同时使用反斜杠 \ 转义特殊字符

# 创建字符串
# 字符串可以用单引号或双引号括起来，也可以用三引号括起来创建多行字符串。
print(type("农夫三拳")) # <class 'str'>

# 单引号字符串
single_str = '单引号字符串'
print(single_str)

# 双引号字符串
double_str = "双引号字符串"
print(double_str)

# 三引号多行字符串
multi_line_str = '''三引号支持
多行字符串
'''
print(multi_line_str)

# 原始字符串
# 原始字符串是以 r 开头的字符串，它会忽略反斜杠 \ 的转义作用，可以包含任意的 ASCII 字符。
raw_str = r'原始字\n符串'
print(raw_str)

# 字符串的转义
# 字符串中的反斜杠 \ 用于转义特殊字符，有以下几种情况需要转义：
# - \n 换行
# - \t 制表符
# - \\ 反斜杠本身
# - \' 单引号
# - \" 双引号
# - \a 响铃
# - \b 退格
# - \f 换页
# - \r 回车
# - \v 垂直制表符
escape_str = '转义字符串：\n你吃了吗?'
print(escape_str)

# 字符串的运算符
# 字符串支持的运算符有：
# - + 字符串拼接
# - * 字符串重复拼接
# - [] 索引
# - [:] 切片
# - len() 长度
# - in 成员资格测试
# - str() 类型转换
# - encode() 编码
# - decode() 解码
# - lower() 小写转换
# - upper() 大写转换
# - capitalize() 首字母大写转换
# - title() 所有单词的首字母大写转换
# - swapcase() 大小写互换
# - strip() 去除空白字符
# - lstrip() 去除左边空白字符
# - rstrip() 去除右边空白字符
# - split() 分割字符串
# - join() 连接字符串
# - replace() 替换子字符串
# - format() 格式化
# - % 格式化操作符

# 字符串的拼接
# 字符串可以用加号 + 号进行拼接，也可以用乘号 * 号进行重复拼接。
str1 = 'Hello, '
str2 = 'world!'
str3 = str1 + str2
print(str3)

# 字符串重复拼接
str4 = 'Hello, '
str5 = 'world!'
str6 = str4 * 3 + str5
print(str6)

# 字符串的索引
# 字符串中的每个字符都有一个索引，索引从 0 开始。
str7 = 'Hello, world!'
print(str7[0])  # H
print(str7[5])  # o
print(str7[-1])  # !

# 字符串切片
# 字符串的切片操作可以获取子字符串，语法为 str[start:end:step]，其中 start 为起始索引，end 为结束索引，step 为步长。
# 如果 start 为负数，则从字符串末尾开始计算索引；如果 end 为负数，则从字符串末尾开始计算索引；如果 step 为负数，则表示逆序切片。
str8 = 'FuckYouMather'
print(str8[0:4])  # 从索引 0 开始，到索引 4 结束，不包含索引 4 处的字符。
print(str8[4:7])  # 从索引 4 开始，到索引 7 结束，不包含索引 7 处的字符。
print(str8[7:])   # 从索引 7 开始，到字符串末尾结束。
print(str8[:4])   # 从字符串开头开始取4个字符。
print(str8[-6:])  # 从字符串末尾开始倒数 6 个字符，到字符串末尾结束。
print(str8[::2])  # 从字符串开头开始，每隔 2 个字符取一个字符。
print(str8[::-1]) # 从字符串末尾开始，反向取字符(将字符串反向)。

# 字符串的长度
# 字符串的长度是指字符串中字符的个数。
str9 = 'Hello, world!'
print(len(str9))  # 13

# 字符串的格式化
# 字符串可以用格式化操作符 % 进行格式化。
name = 'Alice'
age = 25
str10 = 'My name is %s, and I am %d years old.' % (name, age)
print(str10)  # My name is Alice, and I am 25 years old.


# 字符串的运算
# 字符串可以用 + 号进行拼接，也可以用 * 号进行重复拼接。
str11 = 'fuck '
str12 = 'you'
str13 = str11 + str12
print(str13)  # fuck you
str16 = str11 * 3 + str12   # str11 * 3 得到 'fuck, fuck, fuck'，再用 + 号拼接 'you'
print(str16)  # fuck, fuck, fuck, you!

# 字符串的比较
# 字符串可以用 == 号进行比较，如果两个字符串相等，则返回 True，否则返回 False。
str17 = 'Hello, world!'
str18 = 'Hello, world!'
if str17 == str18:
    print('相等.')  # The strings are equal.
else:
    print('不相等.')  # The strings are not equal.

# 字符串的成员资格
# 字符串可以用 in 关键字进行成员资格测试，如果字符串中包含指定的子字符串，则返回 True，否则返回 False。
str19 = '晚安, 玛卡巴卡!'
if '吗的' in str19:
    print('The string contains "吗的".')  # The string contains "world".
else:
    print('The string does not contain "吗的".')  # The string does not contain "world".

# 字符串类型转换
# 字符串可以用 str() 函数进行类型转换。
str20 = 123
str21 = str(str20)
print(str21)  # 123

# 字符串的编码
# 字符串可以用 encode() 方法进行编码，encode() 方法可以将字符串转换为指定的编码格式。
str22 = 'Hello, world!'
str23 = str22.encode('utf-8')
print(str23)  # b'Hello, world!'

# 字符串可以用 decode() 方法进行解码，decode() 方法可以将指定编码格式的字符串转换为字符串。
# 字符串解码
str24 = b'Hello, world!'
str25 = str24.decode('utf-8')
print(str25)  # Hello, world!

# 字符串的其他操作
# 字符串的其他操作包括：
# - 字符串的分割：字符串可以用 split() 方法进行分割，split() 方法可以将字符串按照指定分隔符进行分割，并返回一个列表。
# - 字符串的连接：字符串可以用 join() 方法进行连接，join() 方法可以将一个列表中的元素按照指定分隔符进行连接，并返回一个字符串。
# - 字符串的替换：字符串可以用 replace() 方法进行替换，replace() 方法可以将字符串中的指定子字符串替换为另一个子字符串，并返回一个新的字符串。
# - 字符串的大小写转换：字符串可以用 lower() 方法进行小写转换，upper() 方法进行大写转换，capitalize() 方法进行首字母大写转换。
# - 字符串的格式化：字符串可以用 format() 方法进行格式化，format() 方法可以将字符串中的占位符替换为指定的值，并返回一个新的字符串。
# - 字符串的格式化操作符：字符串可以用 % 进行格式化，%s 用于替换字符串，%d 用于替换整数，%f 用于替换浮点数。

# 字符串的其他操作示例
# 字符串的分割
str26 = 'Hello, world!'
str27 = str26.split(',')
print(str27)  # ['Hello', ' world!']

# 字符串的连接
str28 = ['fuck', 'you!']
str29 = ', '.join(str28)
print(str29)  # fuck, you!

# 字符串的替换
str30 = 'Hello, world!'
str31 = str30.replace('world', 'Python') # 替换子字符串
print(str31)  # Hello, Python!

# 字符串的大小写转换
str32 = 'crazy PYTHON'
str33 = str32.lower()   # 小写转换
print(str33)  # crazy python
str34 = str32.upper()   # 大写转换
print(str34)  # CRAZY PYTHON
str35 = str32.capitalize()  # 首字母大写转换
print(str35)  # Crazy python
title = str32.title()  # 所有单词的首字母大写转换
print(title)  # Crazy Python
swapcase_str = str32.swapcase()  # 大小写互换
print(swapcase_str)  # CRAZY python

# 字符串的格式化
str36 = 'My name is {0}, and I am {1} years old.'
str37 = str36.format('风清影竹', 25)
print(str37)  # My name is 风清影竹, and I am 25 years old.

# 字符串的格式化操作符
str38 = 'My name is %s, and I am %d years old.' % ('风清影竹', 25)
print(str38)  # My name is 风清影竹, and I am 25 years old.

# 去除空白字符
str39 = '  你是，沙雕吗？  '
str40 = str39.strip()  # 去除两端空白字符
print(str40)  # 你是，沙雕吗？
str41 = str39.lstrip()  # 去除左边空白字符
print(str41)  # 你是，沙雕吗？
str42 = str39.rstrip()  # 去除右边空白字符
print(str42)  #  你是，沙雕吗？

# 子串的计数
# 字符串的 count() 方法可以统计子串出现的次数。
str44 = 'Hello, world!'
print(str44.count('llo'))  # 1
print(str44.count('Python'))  # 0

# 子串的查找
# 字符串的 find() 方法可以查找子串的位置，如果子串不存在，则返回 -1。
# 字符串的 rfind() 方法可以从右边开始查找子串的位置，如果子串不存在，则返回 -1。
# 字符串的 index() 方法可以查找子串的位置，如果子串不存在，则会抛出 ValueError 异常。
# 字符串的 rindex() 方法可以从右边开始查找子串的位置，如果子串不存在，则会抛出 ValueError 异常。
str43 = 'Hello, world!'
print(str43.find('wor'))  # 7
print(str43.find('Python'))  # -1
print(str43.rfind('wor'))  # 7
print(str43.rfind('Python'))  # -1
print(str43.index('wor'))  # 7
#print(str43.index('Python'))  # ValueError: substring not found
print(str43.rindex('wor'))  # 7
#print(str43.rindex('Python'))  # ValueError: substring not found

# 字符串填充
# 字符串的 ljust() 方法可以将字符串左对齐，并使用空格填充，ljust() 方法可以指定填充的长度。
# 字符串的 rjust() 方法可以将字符串右对齐，并使用空格填充，rjust() 方法可以指定填充的长度。
# 字符串的 center() 方法可以将字符串居中，并使用空格填充，center() 方法可以指定填充的长度。
# 字符串的 zfill() 方法可以将字符串左对齐，并使用 0 填充，zfill() 方法可以指定填充的长度。
# 字符串的 expandtabs() 方法可以将字符串中的制表符 \t 转换为指定数量的空格。
str45 = 'Hello, world!'
str46 = str45.ljust(20, '-')  # 左对齐，并使用-填充
print(str46)  # Hello, world!
str47 = str45.rjust(20)  # 右对齐，并使用空格填充
print(str47)  #     Hello, world!
str48 = str45.center(20, "*")  # 居中，并使用*填充
print(str48)  #   Hello, world!
str49 = str45.zfill(20)  # 左对齐，并使用0填充
print(str49)  # 000000000Hello, world!
str50 = 'Hello\tworld!'
str51 = str50.expandtabs(4)  # 将制表符转换为4个空格
print(str51)  # Hello    world!